/*******************************************************************************
 * @file    hwa_74hc595.h
 * @brief   74HC595移位寄存器驱动头文件
 * @author  Talon
 * @date    2025/09/26
 * @version V1.0
 ******************************************************************************/
#ifndef __HWA_74HC595_H__
#define __HWA_74HC595_H__
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>

/* User Configuration --------------------------------------------------------*/
/* 用户配置区：根据实际硬件连接修改以下参数 */
#include "main.h"
#include "gpio.h"

// 1. IO引脚定义
#define SR_DATA_PORT    C595_Data_GPIO_Port   /* 数据端口 */
#define SR_DATA_PIN     C595_Data_Pin        /* 数据引脚 */
#define SR_SHIFT_PORT   C595_Shift_GPIO_Port  /* 移位时钟端口 */
#define SR_SHIFT_PIN    C595_Shift_Pin       /* 移位时钟引脚 */
#define SR_LATCH_PORT   C595_Latch_GPIO_Port  /* 锁存端口 */
#define SR_LATCH_PIN    C595_Latch_Pin       /* 锁存引脚 */

// 2. 级联595芯片数量配置
typedef enum
{
    SR_SEL_1 = 0,  /* 级联芯片1 */
    SR_SEL_2,      /* 级联芯片2 */
    SR_SEL_3,      /* 级联芯片3 */

    NUM_OF_SR_SEL  /* 级联芯片总数 */
} SR_SEL_E;

// 3. 延时函数
#ifndef SR_DELAY_US
#define SR_DELAY_US(us)  delay_us(us)
#endif

/* Exported macro ------------------------------------------------------------*/
#define SR_DATA_HIGH()   HAL_GPIO_WritePin(SR_DATA_PORT, SR_DATA_PIN, GPIO_PIN_SET)
#define SR_DATA_LOW()    HAL_GPIO_WritePin(SR_DATA_PORT, SR_DATA_PIN, GPIO_PIN_RESET)
#define SR_DATA_SET(val) HAL_GPIO_WritePin(SR_DATA_PORT, SR_DATA_PIN, val)
#define SR_SHIFT_HIGH()  HAL_GPIO_WritePin(SR_SHIFT_PORT, SR_SHIFT_PIN, GPIO_PIN_SET)
#define SR_SHIFT_LOW()   HAL_GPIO_WritePin(SR_SHIFT_PORT, SR_SHIFT_PIN, GPIO_PIN_RESET)
#define SR_LATCH_HIGH()  HAL_GPIO_WritePin(SR_LATCH_PORT, SR_LATCH_PIN, GPIO_PIN_SET)
#define SR_LATCH_LOW()   HAL_GPIO_WritePin(SR_LATCH_PORT, SR_LATCH_PIN, GPIO_PIN_RESET)

/* Exported typedef ----------------------------------------------------------*/
typedef enum
{
    SR_CHANNEL_0 = 0,  /* 通道0 */
    SR_CHANNEL_1 = 1,  /* 通道1 */
    SR_CHANNEL_2 = 2,  /* 通道2 */
    SR_CHANNEL_3 = 3,  /* 通道3 */
    SR_CHANNEL_4 = 4,  /* 通道4 */
    SR_CHANNEL_5 = 5,  /* 通道5 */
    SR_CHANNEL_6 = 6,  /* 通道6 */
    SR_CHANNEL_7 = 7,  /* 通道7 */

    NUM_OF_SR_CHANNEL  /* 通道总数 */
} SR_CHANNEL_E;

/* Exported functions --------------------------------------------------------*/
/**
 * @brief   控制指定级联芯片的指定通道开关
 * @param   sel     级联芯片选择
 * @param   channel 通道选择
 * @param   on_off  开关状态（1:开，0:关）
 * @retval  无
 */
extern void hwa_74HC595ChannelCtrl(SR_SEL_E sel, SR_CHANNEL_E channel, uint8_t on_off);

/**
 * @brief   74HC595定时处理函数，建议每10ms调用一次
 * @param   无
 * @retval  无
 */
extern void hwa_74HC595_Handler10ms(void);

/**
 * @brief   进入休眠模式，关闭所有级联芯片的控制信号
 * @param   无
 * @retval  无
 */
extern void hwa_74HC595_Sleep(void);

#endif
